🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / map / src / commonMain / kotlin / org / meshtastic / feature / map / kml / KmlReader.kt
Displaying Raw • Download
feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/kml/KmlReader.kt renovate/fastlane-2.x-lockfile (056eed64) Text, 10.86 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.map.kml
Tff7b72import T7ee787nl.adaptivity.xmlutil.EventType
Tff7b72import T7ee787nl.adaptivity.xmlutil.XmlReader
Tff7b72import T7ee787nl.adaptivity.xmlutil.readSimpleElement
T8b949e/** A `<Style>` id and what this app can use of it. Null when the style has no id to reference it by. */
Tff7b72internal Tff7b72fun Te6edf3XmlReaderTb4b4b4.Td2a8ffreadStyleTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3PairTff7b72<Tffa657StringTb4b4b4, Te6edf3KmlStyleTff7b72>Tff7b72? Tb4b4b4{
Tff7b72val Te6edf3id Tff7b72= Te6edf3getAttributeValueTb4b4b4(Tff7b72nullTb4b4b4, Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3style Tff7b72= Te6edf3readStyleBodyTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3idTff7b72?.Te6edf3let Tb4b4b4{ Tffa657it Te6edf3to Te6edf3style Tb4b4b4}
Tb4b4b4}
T8b949e/**
* The colours and width of a `<Style>`, read through to its end tag.
*
* Split out from [readStyle] because a Placemark may carry its own `<Style>` with no id at all, and that one still has
* to be read — it is the only styling such a placemark has.
*/
Tff7b72internal Tff7b72fun Te6edf3XmlReaderTb4b4b4.Td2a8ffreadStyleBodyTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3KmlStyle Tb4b4b4{
Tff7b72var Te6edf3style Tff7b72= Te6edf3KmlStyleTb4b4b4(Tb4b4b4)
T8b949e// Which sub-style the reader is inside. A Google Earth export routinely carries an IconStyle and a LabelStyle in
T8b949e// the same Style, each with its own <color>; taking any colour as the line colour painted routes in the icon's.
Tff7b72var Te6edf3enclosingTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72var Te6edf3done Tff7b72= Tff7b72false
Tff7b72while Tb4b4b4(Tff7b72!Te6edf3doneTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3nextTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3EventTypeTb4b4b4.Te6edf3START_ELEMENT Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3localName Tff7b72in Te6edf3SUB_STYLESTb4b4b4) Tb4b4b4{
Te6edf3enclosing Tff7b72= Te6edf3localName
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3style Tff7b72= Te6edf3styleTb4b4b4.Te6edf3withStyleElementTb4b4b4(Te6edf3localNameTb4b4b4, Te6edf3enclosingTb4b4b4) Tb4b4b4{ Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Te6edf3EventTypeTb4b4b4.Te6edf3END_ELEMENT Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3localNameTb4b4b4) Tb4b4b4{
Tff7b72in Te6edf3SUB_STYLES Tff7b72-Tff7b72> Te6edf3enclosing Tff7b72= Tff7b72null
Ta5d6ff"Ta5d6ffStyleTa5d6ff" Tff7b72-Tff7b72> Te6edf3done Tff7b72= Tff7b72true
Tff7b72else Tff7b72-Tff7b72> Tffa657Unit
Tb4b4b4}
Te6edf3EventTypeTb4b4b4.Te6edf3END_DOCUMENT Tff7b72-Tff7b72> Te6edf3done Tff7b72= Tff7b72true
Tff7b72else Tff7b72-Tff7b72> Tffa657Unit
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3style
Tb4b4b4}
T8b949e/** The `<Style>` children that own a colour or a width. Anything else in a Style is skipped. */
Tff7b72private Tff7b72val Te6edf3SUB_STYLES Tff7b72= Te6edf3setOfTb4b4b4(Ta5d6ff"Ta5d6ffLineStyleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffPolyStyleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffIconStyleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLabelStyleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffBalloonStyleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffListStyleTa5d6ff"Tb4b4b4)
T8b949e/**
* Folds one element of a `<Style>` sub-style into the style being built.
*
* Only LineStyle, PolyStyle and an IconStyle's image contribute: an IconStyle or LabelStyle *colour* still says nothing
* about how a route or a zone is drawn. `<fill>0</fill>` is how KML says "no fill", so it means outline only rather
* than a fill of nothing.
*
* [value] is called only for an element that contributes, so an element we ignore is left unconsumed — exactly as it
* was under the pull parser this replaced.
*/
Tff7b72private Tff7b72fun Te6edf3KmlStyleTb4b4b4.Td2a8ffwithStyleElementTb4b4b4(Te6edf3tagTb4b4b4: Tffa657StringTb4b4b4, Te6edf3enclosingTb4b4b4: Tffa657String?Tb4b4b4, Te6edf3valueTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3KmlStyle Tff7b72= Tff7b72when Tb4b4b4{
T8b949e// `<Icon>` is not itself a sub-style, so it falls through without clearing `enclosing`, and the `<href>`
T8b949e// inside it still reads as belonging to the IconStyle. NetworkLink's `<Link><href>` cannot be confused with
T8b949e// it, because that one is never inside an IconStyle.
Te6edf3tag Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffhrefTa5d6ff" Tff7b72&Tff7b72& Te6edf3enclosing Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffIconStyleTa5d6ff" Tff7b72-Tff7b72> Te6edf3copyTb4b4b4(Te6edf3iconHref Tff7b72= Te6edf3valueTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4)
Te6edf3tag Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffcolorTa5d6ff" Tff7b72&Tff7b72& Te6edf3enclosing Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffPolyStyleTa5d6ff" Tff7b72-Tff7b72> Te6edf3copyTb4b4b4(Te6edf3fillColor Tff7b72= Te6edf3valueTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3tag Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffcolorTa5d6ff" Tff7b72&Tff7b72& Te6edf3enclosing Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffLineStyleTa5d6ff" Tff7b72-Tff7b72> Te6edf3copyTb4b4b4(Te6edf3lineColor Tff7b72= Te6edf3valueTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3tag Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffwidthTa5d6ff" Tff7b72&Tff7b72& Te6edf3enclosing Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffLineStyleTa5d6ff" Tff7b72-Tff7b72> Te6edf3copyTb4b4b4(Te6edf3lineWidth Tff7b72= Te6edf3valueTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toFloatOrNullTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3tag Tff7b72=Tff7b72= Ta5d6ff"Ta5d6fffillTa5d6ff" Tff7b72&Tff7b72& Te6edf3enclosing Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffPolyStyleTa5d6ff" Tff7b72-Tff7b72> Te6edf3copyTb4b4b4(Te6edf3filled Tff7b72= Te6edf3valueTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Ta5d6ff"Ta5d6ff0Ta5d6ff"Tb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Tff7b72this
Tb4b4b4}
T8b949e/** A `<StyleMap>` id and the style id its `normal` pair points at. */
Tff7b72internal Tff7b72fun Te6edf3XmlReaderTb4b4b4.Td2a8ffreadStyleMapTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3PairTff7b72<Tffa657StringTb4b4b4, Tffa657StringTff7b72>Tff7b72? Tb4b4b4{
Tff7b72val Te6edf3id Tff7b72= Te6edf3getAttributeValueTb4b4b4(Tff7b72nullTb4b4b4, Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4)
Tff7b72var Te6edf3keyTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72var Te6edf3targetTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72var Te6edf3done Tff7b72= Te6edf3id Tff7b72=Tff7b72= Tff7b72null
Tff7b72while Tb4b4b4(Tff7b72!Te6edf3doneTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3nextTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3EventTypeTb4b4b4.Te6edf3START_ELEMENT Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3localNameTb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ffkeyTa5d6ff" Tff7b72-Tff7b72> Te6edf3key Tff7b72= Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)
Ta5d6ff"Ta5d6ffstyleUrlTa5d6ff" Tff7b72-Tff7b72> Tff7b72if Tb4b4b4(Te6edf3key Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffnormalTa5d6ff"Tb4b4b4) Te6edf3target Tff7b72= Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Tffa657Unit
Tb4b4b4}
Te6edf3EventTypeTb4b4b4.Te6edf3END_ELEMENT Tff7b72-Tff7b72> Tff7b72if Tb4b4b4(Te6edf3localName Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffStyleMapTa5d6ff"Tb4b4b4) Te6edf3done Tff7b72= Tff7b72true
Te6edf3EventTypeTb4b4b4.Te6edf3END_DOCUMENT Tff7b72-Tff7b72> Te6edf3done Tff7b72= Tff7b72true
Tff7b72else Tff7b72-Tff7b72> Tffa657Unit
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72if Tb4b4b4(Te6edf3id Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3target Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3id Te6edf3to Te6edf3target Tff7b72else Tff7b72null
Tb4b4b4}
Tff7b72internal Tff7b72fun Te6edf3XmlReaderTb4b4b4.Td2a8ffreadPlacemarkTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3Placemark Tb4b4b4{
Tff7b72val Te6edf3reader Tff7b72= Te6edf3PlacemarkReaderTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3done Tff7b72= Tff7b72false
Tff7b72while Tb4b4b4(Tff7b72!Te6edf3doneTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3nextTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3EventTypeTb4b4b4.Te6edf3START_ELEMENT Tff7b72-Tff7b72> Te6edf3readerTb4b4b4.Te6edf3onStartElementTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3localNameTb4b4b4)
Te6edf3EventTypeTb4b4b4.Te6edf3END_ELEMENT Tff7b72-Tff7b72> Tff7b72if Tb4b4b4(Te6edf3localName Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffPlacemarkTa5d6ff"Tb4b4b4) Te6edf3done Tff7b72= Tff7b72true
Te6edf3EventTypeTb4b4b4.Te6edf3END_DOCUMENT Tff7b72-Tff7b72> Te6edf3done Tff7b72= Tff7b72true
Tff7b72else Tff7b72-Tff7b72> Tffa657Unit
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3readerTb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
T8b949e/**
* Accumulates one Placemark as its elements arrive.
*
* A class rather than a pile of locals in the loop because a Polygon's outer ring and its holes both arrive as
* `<coordinates>` and the reader has to remember which geometry it is inside and whether it already took a ring.
*/
Tff7b72private Tff7b72class T56d364PlacemarkReader Tb4b4b4{
Tff7b72private Tff7b72var Te6edf3nameTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72private Tff7b72var Te6edf3descriptionTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72private Tff7b72var Te6edf3styleUrlTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72private Tff7b72var Te6edf3inlineStyleTb4b4b4: Te6edf3KmlStyle? Tff7b72= Tff7b72null
Tff7b72private Tff7b72val Te6edf3geometries Tff7b72= Te6edf3mutableListOfTff7b72<Te6edf3KmlGeometryTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72var Te6edf3pendingTypeTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72private Tff7b72var Te6edf3polygonTaken Tff7b72= Tff7b72false
Tff7b72fun Td2a8ffonStartElementTb4b4b4(Te6edf3readerTb4b4b4: Te6edf3XmlReaderTb4b4b4, Te6edf3tagTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3tagTb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff" Tff7b72-Tff7b72> Te6edf3name Tff7b72= Te6edf3readerTb4b4b4.Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)
Ta5d6ff"Ta5d6ffdescriptionTa5d6ff" Tff7b72-Tff7b72> Te6edf3description Tff7b72= Te6edf3readerTb4b4b4.Te6edf3readElementTextSkippingMarkupTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)
Ta5d6ff"Ta5d6ffstyleUrlTa5d6ff" Tff7b72-Tff7b72> Te6edf3styleUrl Tff7b72= Te6edf3readerTb4b4b4.Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)
T8b949e// An inline Style is consumed here or not at all: the top-level scan never sees it, because this reader
T8b949e// has already run to the Placemark's end tag by then.
Ta5d6ff"Ta5d6ffStyleTa5d6ff" Tff7b72-Tff7b72> Te6edf3inlineStyle Tff7b72= Te6edf3readerTb4b4b4.Te6edf3readStyleBodyTb4b4b4(Tb4b4b4)
Tff7b72in Te6edf3GEOMETRY_TAGS Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3pendingType Tff7b72= Te6edf3tag
Te6edf3polygonTaken Tff7b72= Tff7b72false
Tb4b4b4}
Ta5d6ff"Ta5d6ffcoordinatesTa5d6ff" Tff7b72-Tff7b72> Te6edf3takeCoordinatesTb4b4b4(Te6edf3readerTb4b4b4.Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Tffa657Unit
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8fftakeCoordinatesTb4b4b4(Te6edf3rawTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3geometryFromTb4b4b4(Te6edf3pendingTypeTb4b4b4, Te6edf3parseCoordinatesTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4, Te6edf3polygonTakenTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3parsed Tff7b72-Tff7b72>
Te6edf3geometries Tff7b72+Tff7b72= Te6edf3parsed
Tff7b72if Tb4b4b4(Te6edf3parsedTb4b4b4.Te6edf3isPolygonalTb4b4b4) Te6edf3polygonTaken Tff7b72= Tff7b72true
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffbuildTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3Placemark Tff7b72=
Te6edf3PlacemarkTb4b4b4(Te6edf3name Tff7b72= Te6edf3nameTb4b4b4, Te6edf3description Tff7b72= Te6edf3descriptionTb4b4b4, Te6edf3styleUrl Tff7b72= Te6edf3styleUrlTb4b4b4, Te6edf3inlineStyle Tff7b72= Te6edf3inlineStyleTb4b4b4)Tb4b4b4.Te6edf3also Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3geometries Tff7b72+Tff7b72= Te6edf3geometries
Tb4b4b4}
Tb4b4b4}
T8b949e/** The geometry elements this reader understands. Everything else in a Placemark is skipped. */
Tff7b72private Tff7b72val Te6edf3GEOMETRY_TAGS Tff7b72= Te6edf3setOfTb4b4b4(Ta5d6ff"Ta5d6ffPointTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLineStringTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffPolygonTa5d6ff"Tb4b4b4)
T8b949e/**
* The character content of the current element, nested markup skipped rather than fatal.
*
* For `<description>`, which legitimately holds HTML — usually CDATA-wrapped, but raw nested elements are valid XML
* too, and `readSimpleElement` throws on the first one. The markup itself is not wanted (the info card renders plain
* text), so only the text between the tags is kept.
*/
Tff7b72private Tff7b72fun Te6edf3XmlReaderTb4b4b4.Td2a8ffreadElementTextSkippingMarkupTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3text Tff7b72= Te6edf3StringBuilderTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3depth Tff7b72= T79c0ff1
Tff7b72while Tb4b4b4(Te6edf3depth Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3nextTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3EventTypeTb4b4b4.Te6edf3START_ELEMENT Tff7b72-Tff7b72> Te6edf3depthTff7b72+Tff7b72+
Te6edf3EventTypeTb4b4b4.Te6edf3END_ELEMENT Tff7b72-Tff7b72> Te6edf3depthTff7b72-Tff7b72-
Te6edf3EventTypeTb4b4b4.Te6edf3TEXTTb4b4b4,
Te6edf3EventTypeTb4b4b4.Te6edf3CDSECTTb4b4b4,
Tff7b72-Tff7b72> Te6edf3textTb4b4b4.Te6edf3appendTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3textTb4b4b4)
Te6edf3EventTypeTb4b4b4.Te6edf3END_DOCUMENT Tff7b72-Tff7b72> Te6edf3depth Tff7b72= T79c0ff0
Tff7b72else Tff7b72-Tff7b72> Tffa657Unit
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3textTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4}
T8b949e/**
* One geometry from a `<coordinates>` run, or null when there is nothing usable in it.
*
* [polygonTaken] guards a polygon's holes: an inner ring arrives as another `<coordinates>` and only the outer one is
* drawn, so a ring already taken is not overwritten.
*/
Tff7b72private Tff7b72fun Td2a8ffgeometryFromTb4b4b4(Te6edf3typeTb4b4b4: Tffa657String?Tb4b4b4, Te6edf3positionsTb4b4b4: Te6edf3ListTff7b72<Te6edf3GeoPositionTff7b72>Tff7b72?Tb4b4b4, Te6edf3polygonTakenTb4b4b4: Tffa657BooleanTb4b4b4)Tb4b4b4: Te6edf3KmlGeometry? Tff7b72= Tff7b72when Tb4b4b4{
Te6edf3positions Tff7b72=Tff7b72= Tff7b72null Tff7b72-Tff7b72> Tff7b72null
Te6edf3type Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffPointTa5d6ff" Tff7b72-Tff7b72> Te6edf3positionsTb4b4b4.Te6edf3firstOrNullTb4b4b4(Tb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3pointGeometryTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Te6edf3type Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffLineStringTa5d6ff" Tff7b72-Tff7b72> Tff7b72if Tb4b4b4(Te6edf3positionsTb4b4b4.Te6edf3size Tff7b72>Tff7b72= Te6edf3MIN_LINE_POSITIONSTb4b4b4) Te6edf3lineGeometryTb4b4b4(Te6edf3positionsTb4b4b4) Tff7b72else Tff7b72null
Te6edf3type Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffPolygonTa5d6ff" Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3polygonTaken Tff7b72&Tff7b72& Te6edf3positionsTb4b4b4.Te6edf3size Tff7b72>Tff7b72= Te6edf3MIN_RING_POSITIONSTb4b4b4) Te6edf3polygonGeometryTb4b4b4(Te6edf3positionsTb4b4b4) Tff7b72else Tff7b72null
Tff7b72else Tff7b72-Tff7b72> Tff7b72null
Tb4b4b4}
T8b949e/**
* A `<GroundOverlay>`, read through to its end tag. Null when the overlay is missing its image or any box edge — there
* is nothing drawable without either.
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4) T8b949e// one branch per KML tag; splitting them would hide the element shape
Tff7b72internal Tff7b72fun Te6edf3XmlReaderTb4b4b4.Td2a8ffreadGroundOverlayTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3KmlGroundOverlay? Tb4b4b4{
Tff7b72var Te6edf3nameTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72var Te6edf3hrefTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72var Te6edf3northTb4b4b4: Tffa657Double? Tff7b72= Tff7b72null
Tff7b72var Te6edf3southTb4b4b4: Tffa657Double? Tff7b72= Tff7b72null
Tff7b72var Te6edf3eastTb4b4b4: Tffa657Double? Tff7b72= Tff7b72null
Tff7b72var Te6edf3westTb4b4b4: Tffa657Double? Tff7b72= Tff7b72null
Tff7b72var Te6edf3rotation Tff7b72= T79c0ff0.0
Tff7b72var Te6edf3depth Tff7b72= T79c0ff1
Tff7b72while Tb4b4b4(Te6edf3depth Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3nextTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3EventTypeTb4b4b4.Te6edf3START_ELEMENT Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3localNameTb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff" Tff7b72-Tff7b72> Te6edf3name Tff7b72= Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)
Ta5d6ff"Ta5d6ffhrefTa5d6ff" Tff7b72-Tff7b72> Te6edf3href Tff7b72= Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)
Ta5d6ff"Ta5d6ffnorthTa5d6ff" Tff7b72-Tff7b72> Te6edf3north Tff7b72= Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toDoubleOrNullTb4b4b4(Tb4b4b4)
Ta5d6ff"Ta5d6ffsouthTa5d6ff" Tff7b72-Tff7b72> Te6edf3south Tff7b72= Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toDoubleOrNullTb4b4b4(Tb4b4b4)
Ta5d6ff"Ta5d6ffeastTa5d6ff" Tff7b72-Tff7b72> Te6edf3east Tff7b72= Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toDoubleOrNullTb4b4b4(Tb4b4b4)
Ta5d6ff"Ta5d6ffwestTa5d6ff" Tff7b72-Tff7b72> Te6edf3west Tff7b72= Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toDoubleOrNullTb4b4b4(Tb4b4b4)
Ta5d6ff"Ta5d6ffrotationTa5d6ff" Tff7b72-Tff7b72> Te6edf3rotation Tff7b72= Te6edf3readSimpleElementTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toDoubleOrNullTb4b4b4(Tb4b4b4) Tff7b72?: T79c0ff0.0
Tff7b72else Tff7b72-Tff7b72> Te6edf3depthTff7b72+Tff7b72+
Tb4b4b4}
Te6edf3EventTypeTb4b4b4.Te6edf3END_ELEMENT Tff7b72-Tff7b72> Te6edf3depthTff7b72-Tff7b72-
Te6edf3EventTypeTb4b4b4.Te6edf3END_DOCUMENT Tff7b72-Tff7b72> Te6edf3depth Tff7b72= T79c0ff0
Tff7b72else Tff7b72-Tff7b72> Tffa657Unit
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3image Tff7b72= Te6edf3hrefTff7b72?.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3edges Tff7b72= Te6edf3listOfNotNullTb4b4b4(Te6edf3northTb4b4b4, Te6edf3southTb4b4b4, Te6edf3eastTb4b4b4, Te6edf3westTb4b4b4)
Tff7b72return Tff7b72if Tb4b4b4(Te6edf3image Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3edgesTb4b4b4.Te6edf3size Tff7b72< Te6edf3BOX_EDGESTb4b4b4) Tb4b4b4{
Tff7b72null
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3KmlGroundOverlayTb4b4b4(
Te6edf3name Tff7b72= Te6edf3nameTb4b4b4,
Te6edf3href Tff7b72= Te6edf3imageTb4b4b4,
Te6edf3north Tff7b72= Te6edf3edgesTff7b72[T79c0ff0Tff7b72]Tb4b4b4,
Te6edf3south Tff7b72= Te6edf3edgesTff7b72[T79c0ff1Tff7b72]Tb4b4b4,
Te6edf3east Tff7b72= Te6edf3edgesTff7b72[T79c0ff2Tff7b72]Tb4b4b4,
Te6edf3west Tff7b72= Te6edf3edgesTff7b72[T79c0ff3Tff7b72]Tb4b4b4,
Te6edf3rotationDegrees Tff7b72= Te6edf3rotationTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e/** A LatLonBox is only a box with all four of north, south, east and west. */
Tff7b72private Tff7b72const Tff7b72val Te6edf3BOX_EDGES Tff7b72= T79c0ff4
Served by rngit 1.5.2 - Generated in 0.3s